#ifndef INTERCODE_GEN_H
#define INTERCODE_GEN_H

#include "symbol_table.h"
#include <stdio.h>
#include <stdlib.h>

#define MAX_LINE 10000  // 静态数组最大容量

/*--------------------- 操作数(Operand)定义 ---------------------*/
typedef struct Operand_* Operand;

// 操作数类型（明确每个类型的用途）
typedef enum {
	VARIABLE,   // 变量（如 t1, x）
	CONSTANT,   // 常量（如 #5）
	ADDRESS,    // 地址（如 &arr）
	LABEL,      // 标签（如 label1）
	RELOP       // 关系运算符（如 <, !=）
} OperandKind;

struct Operand_ {
	OperandKind kind;  // 操作数类型
	union {
		int value;     
		char* name;
	} u;
};

/*--------------------- 中间代码(InterCode)定义 ---------------------*/
typedef enum {
	ASSIGN,   // 赋值 x := y
	ADD,      // 加法 x := y + z
	SUB,      // 减法 x := y - z
	MUL,      // 乘法 x := y * z
	DIV,      // 除法 x := y / z
	LABEL_IR, // 标签定义 LABEL x :
	FUNC, // 函数定义 FUNCTION f :
	GOTO,     // 无条件跳转 GOTO x
	IF_GOTO,  // 条件跳转 IF y < z GOTO x
	RETURN,   // 返回 RETURN x
	DEC,      // 内存分配 DEC x [size]
	ARG,      // 参数传递 ARG x
    PARAM,    
	CALL,     // 函数调用 x := CALL f
	READ,     // 输入 READ x
	WRITE     // 输出 WRITE x
}InterCodeKind;

typedef struct InterCode {
	// 指令类型（覆盖所有操作）
	InterCodeKind kind;

	// 操作数联合（根据指令类型使用不同结构）
	union {
		struct { Operand right, left; } assign;  // 用于 ASSIGN
		struct { Operand result, op1, op2; } binop; // 用于 ADD/SUB/MUL/DIV
		struct { Operand label; } label;         // 用于 LABEL_IR
		struct { Operand func; } function;       // 用于 FUNCTION
		struct { Operand target; } jump;         // 用于 GOTO
		struct { Operand x, relop, y, z; } cond; // 用于 IF_GOTO
		struct { Operand ret_val; } ret;         // 用于 RETURN
		struct { Operand var; int size; } dec;   // 用于 DEC
		struct { Operand arg; } arg;             // 用于 ARG
		struct { Operand ret, func; } call;      // 用于 CALL
		struct { Operand var; } io;              // 用于 READ/WRITE
        struct { Operand param; } param;           // PARAM
	} u;
} InterCode;

extern InterCode ir_codes[MAX_LINE];
extern int ir_count;

void test_ir_generation(); // 测试中间代码生成函数
char* operand_to_str(Operand op);

// 中间代码生成函数
void gen_assign(Operand left, Operand right);       // ASSIGN
void gen_binop(int kind, Operand res, Operand op1, Operand op2); // ADD/SUB/MUL/DIV
void gen_ifgoto(Operand x, Operand relop, Operand y, Operand z); // IF_GOTO
void gen_label(Operand label);                      // LABEL_IR
void gen_goto(Operand label);                       // GOTO
void gen_dec(Operand var, int size);                // DEC
void gen_call(Operand res, Operand func);           // CALL
void gen_return(Operand val);                       // RETURN
void gen_arg(Operand arg);                          // ARG
void gen_param(Operand param);
void gen_read(Operand dest);
void gen_write(Operand src);

// 核心翻译函数
void translate_Exp(ParseNode Exp, Operand place);
void translate_Args(ParseNode Args, Operand *arg_list, int *num);
void translate_Cond(ParseNode Exp, Operand label_true, Operand label_false);
void translate_Stmt(ParseNode Stmt);
void translate_StmtList(ParseNode StmtList);
void translate_VarDec(ParseNode VarDec);
void translate_Dec(ParseNode Dec);
void translate_DecList(ParseNode DecList);
void translate_Def(ParseNode Def);
void translate_DefList(ParseNode DefList);
void translate_CompSt(ParseNode CompSt);
void translate_ParamDec(ParseNode ParamDec);
void translate_VarList(ParseNode VarList);
void translate_FunDec(ParseNode FunDec);
void translate_ExtDecList(ParseNode ExtDecList);
void translate_ExtDef(ParseNode ExtDef);
void translate_ExtDefList(ParseNode ExtDefList);
void translate_Program(ParseNode Program);

#endif